package com.glink.manage.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.glink.common.exception.GeneralSimpleException;
import com.glink.manage.domain.PersonManageBean;
import com.glink.manage.dto.person.*;
import com.glink.manage.vo.barriergate.PersonSyncDetailInfoVO;
import com.glink.manage.vo.org.OrgPersonInfoVO;
import com.glink.manage.vo.person.*;
import com.glink.manage.vo.temporaryadmission.TemporaryAdmissionCheckWorkVO;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

/**
 * @author  qiushaoshan
 * @since  2025-01-13
 */
public interface PersonManageService extends IService<PersonManageBean> {

    /**
     * 新增人员信息
     * @param dto 人员信息
     * @return 新增状态
     */
    String insertPerson(PersonManageSaveDTO dto) throws GeneralSimpleException;

    /**
     * 获取ID
     * @return ID
     */
    Integer getMaxPersonId();
    
    /**
     * 修改人员信息
     * @param dto 人员信息
     * @return 修改状态
     */
    String updatePerson(PersonManageUpdateDTO dto) throws GeneralSimpleException;

    /**
     * 查询用户基本信息
     * @param dto 用户ID
     * @return 用户基本信息
     */
    PersonSimpleInfoVO findById(PersonManageIdDTO dto) throws GeneralSimpleException;

    /**
     * 分页查询人员信息
     * @param dto 查询条件
     * @return 人员信息
     */
    IPage<PersonPageVO> pageByPersonInfo(PersonManagePageDTO dto) throws GeneralSimpleException;

    /**
     * 删除人员信息
     * @param dto 人员ID
     * @return 删除状态
     */
    Boolean delByObjId(PersonManageIdDTO dto) throws GeneralSimpleException;

    /**
     * 分页查询准入申请
     * @param dto 分页查询
     * @return 准入申请单
     */
    IPage<PersonAccessMonadPageVO> pageByAccessMonad(PersonAccessMonadPageDTO dto);

    /**
     * 加入或取消黑名单
     * @param dto ID信息
     * @return 状态
     */
    Boolean addBlacklist(PersonManageBlacklistIdDTO dto) throws GeneralSimpleException;

    /**
     * 查询黑名单状态
     * @param associationObjId 用户ID
     * @return 状态
     */
    boolean checkBlackList(String associationObjId) throws GeneralSimpleException;

    /**
     * 分页查询人员信息-黑名单
     * @param dto 分页查询条件
     * @return 人员信息
     */
    IPage<PersonPageVO> pageByPersonInfoBlacklist(PersonManagePageDTO dto) throws GeneralSimpleException;

    /**
     * 根据身份证号查询用户信息
     * @param dto 身份证号
     * @return 用户信息
     */
    PersonSimpleInfoCardVO findByCard(PersonManageCardDTO dto) throws GeneralSimpleException;

    /**
     * 解除黑名单
     * @param dto 用户信息
     * @return 解除状态
     */
    Boolean liftBlacklist(PersonManageIdDTO dto) throws GeneralSimpleException;

    /**
     * 保存准入工程
     * @param personId 人员ID
     * @param constructionWorkObjId 工程ID
     * @param cycleStart 准入周期开始
     * @param cycleEnd 准入周期结束
     */
    void saveAccessWork(String personId, String constructionWorkObjId, Date cycleStart, Date cycleEnd, String accessMonadObjId);

    /**
     * 新增人员账号
     * @param dto 账号新增
     * @return 新增状态
     */
    boolean insertAccount(PersonAccountSaveDTO dto) throws GeneralSimpleException;

    /**
     * 分页查询证件列表
     * @param dto 查询条件
     * @return 证件列表
     */
    IPage<CertificatePageVO> pageCertByPersonAndCar(CertificatePageDTO dto) throws GeneralSimpleException;

    /**
     * 查询人员树
     * @param dto 查询条件
     * @return 人员树
     */
    List<OrgPersonInfoVO> treeByPerson(PersonManageTreeDTO dto);

    /**
     * 查询人员名称
     * @param objId 人员ID
     */
    String findNameByObjId(String objId);

    /**
     * 删除人员账号
     * @param accountObjId 账号ID
     * @return 删除状态
     */
    boolean delAccount(String accountObjId);

    /**
     * 根据参建单位和工程查询准入的用户名称
     * @param constructionWorkObjId 工程ID
     * @param participatingUnitObjId 参建单位ID
     * @return 准入用户名
     */
    List<String> findAccessPersonNameByWorkObjIdAndUnitObjId(String constructionWorkObjId, String participatingUnitObjId);

    /**
     * 更新用户准入周期
     * @param constructionWorkObjId 工程ID
     * @param participatingUnitObjId 参建单位ID
     * @return 更新状态
     */
    boolean updateAccessCycleByWorkObjIdAndUnitObjId(String constructionWorkObjId, String participatingUnitObjId);
    
    /**
     * 根据单位锁定用户账号
     * @param orgId 单位ID
     */
    void lockPersonAccountByOrgId(String orgId);

    /**
     * 根据人员姓名查询证件信息
     * @param dto 姓名
     * @return 人员账号信息
     */
    List<PersonCardInfoVO> findByName(PersonManageNameDTO dto) throws GeneralSimpleException;

    /**
     * 根据用户ID查询用户详细信息
     * @param personIdList 用户ID
     * @param workId 工程ID
     * @return 用户详细信息
     */
    List<PersonSyncDetailInfoVO> findByPersonIdInAndWorkId(List<String> personIdList, String workId);

    /**
     *  根据用户ID查询用户信息
     * @param id 用户ID
     */
    PersonSimpleInfoVO findById(int id);

    /**
     * 根据账号查询用户ID
     * @param accountObjId 账号
     * @return 用户ID
     */
    String findObjIdByAccountObjId(String accountObjId);

    /**
     * 导入人员信息
     * @param file 导入文件
     * @return 人员信息
     */
    List<PersonExpVO> importPersonInfo(MultipartFile file) throws GeneralSimpleException;

    /**
     * 导入人员头像
     * @param file 导入文件
     * @return 人员信息
     */
    List<PersonExpPictureVO> importProfilePicture(MultipartFile file) throws GeneralSimpleException;

    /**
     * 根据设备号和工程查询未同步的人员ID--道闸
     * @param devSno 设备号
     * @param orgIdList 项目部单位ID
     * @param constructionWorkObjId 工程ID
     * @return 人员ID
     */
    List<Integer> findPersonIdByWorkIdAndNotSync(String devSno, List<String> orgIdList, String constructionWorkObjId, Date date, Integer limit);

    /**
     * 根据设备号和工程查询未同步的人员ID--道闸
     *
     * @param devSno                设备号
     * @param constructionWorkObjId 工程ID
     * @return 人员ID
     */
    List<Integer> findPersonIdByWorkId(String devSno, List<String> orgIdList, String constructionWorkObjId, Date nowDate);

    /**
     * 根据设备号和工程查询未同步的人员ID
     *
     * @param devSno                设备号
     * @param constructionWorkObjId 工程ID
     * @return 人员ID
     */
    List<Integer> findPersonIdByExistEffective(String devSno, List<String> orgIdList, String constructionWorkObjId, Date date);
    /**
     * 根据身份证号查询人员ID
     * @param card 身份证号
     * @return 人员ID
     */
    Integer findIdByCard(String card);

    /**
     * 查询工程准入信息
     * @param card 身份证号
     * @param constructionWorkObjId 工程ID
     * @return 准入信息
     */
    List<TemporaryAdmissionCheckWorkVO> findWorkAccess(String card, String constructionWorkObjId);

    /**
     * 根据用户ID查询准入工程
     * @param userId 用户ID
     * @return 准入工程ID
     */
    List<String> findAccessWorkIdByUserId(String userId);
    List<String> findAccessWorkIdByUserId() throws GeneralSimpleException;
}
